home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / music / ptsupp.lha / PT Support archive / Sources / ProTrackerRep.S < prev    next >
Text File  |  1996-01-30  |  33KB  |  1,537 lines

  1.     section    a,CODE_C
  2.  
  3. PT__Channels    =    4
  4.  
  5. Go        lea.l    Module,a0
  6.         jsr    PT_Init            ; Initialize replay
  7.  
  8. .a        cmp.b    #$ff,$dff006        ; Simple beampos-wait
  9.         bne.s    .a
  10. .b        cmp.b    #$ff,$dff006
  11.         beq.s    .b
  12.  
  13.     move.w    #$fff,$dff180
  14.  
  15.         jsr    PT_Music        ; Make music
  16.  
  17.     move.w    #$000,$dff180
  18.  
  19.         btst    #6,$bfe001
  20.         bne.s    .a
  21.  
  22.         jmp    PT_End            ; Shut off audio
  23.  
  24. Module
  25.     incdir    m:
  26.     incbin    "nuke/mod.breath of air"
  27.  
  28.     section main,code
  29.  
  30. ;------------------------------------------------------------------------------
  31. ;
  32. ;    ProTracker playroutine, revision 3
  33. ;
  34. ;    Coded by Lars "ZAP" Hamre
  35. ;    Updated by Håvard "HOWARD/MENTAL DISEASES" Pedersen
  36. ;
  37. ;REVISION 2B:
  38. ;* Mastervolume. (Separate left and right for balance controls.)
  39. ;* Overstep for players using program mode.
  40. ;* Rewind/fast forward. (One pattern)
  41. ;* Easy CIA-utilising.
  42. ;* DMAWait solved. (Finally!)
  43. ;* No longer clears one word behind end of module if instrument 31 is unused.
  44. ;* F00 really halts module now. (Was ignored)
  45. ;* Slower than before. =(
  46. ;* Various small optimisations in attempt to compensate. (Bugs may appear!)
  47. ;* PT_End now stops module, even if music is still called.
  48. ;* Added (selectable) 68020+ optimisations. (Not powerful yet...) 8(
  49. ;
  50. ;REVISION 2C:
  51. ;* Overstep didn't trig on halting the module. Now does.
  52. ;* Made overstep selectable.
  53. ;* Added NoiseTracker compatibility. (Selectable through PT__NTComp) Both NTs
  54. ;  vibrato and loop-position is supported. PT modules are still played as
  55. ;  before.
  56. ;* Fixed some ucase/lcase confusion on some labels.
  57. ;* CIA-tempo wasn't reset upon PT_Init(). Now is.
  58. ;
  59. ;REVISION 3:
  60. ;* Made proper definitions of the chantemp-structure and ensured the entire
  61. ;  source used it.
  62. ;* Rearranged chantemp-structure to make longword accesses on longword
  63. ;  boundaries.
  64. ;* Optimized balance-handling. Now uses as much time as normal mastervolume
  65. ;  would have done.
  66. ;* Did some small optimizations. (Nothing to boast about...)
  67. ;* Renamed PT_MasterVol to PT__MasterVol.
  68. ;* Made maindata structure. (Faster access because of indirect addressing.)
  69. ;  Also makes longword access on longword boundaries.
  70. ;* DMAWait waited far longer than it was supposed to. Used a new scheme based
  71. ;  on the fact that all processors are slowed down to ~7MHz when accessing
  72. ;  CIA registers.
  73. ;* Added selectable amount of channels.
  74. ;* Source is now completely PC-relative.
  75. ;
  76. ;REVISION 4:
  77. ;* Renamed PT_SetIntRate to CIA_SetBPM for compatibility with my ProPruner
  78. ;  replay.
  79. ;* The DMA-wait was buggy, really Commodore's fault because the documentation
  80. ;  there was on it didn't explain the matter fully.
  81. ;* Added external sync using effectcommand 8.
  82. ;
  83. ;PLEASE NOTE!
  84. ;This replay assumes exclusive access to audio hardware and OCS/ECS/AGA or
  85. ;compatible audio chips. This behaviour is _NOT_ encouraged by Commodore!
  86. ;
  87. ;TODO:
  88. ;* Implement pause/continue functions.
  89. ;
  90. ;------------------------------------------------------------------------------
  91.  
  92.     IFND    PT__MasterVol            ; Mastervolume ON/OFF
  93. PT__MasterVol    =    0            ; Call PT_SetMasterVol with
  94.     ENDC                    ; Left in D0 and Right in D1
  95.                         ; ( 0 - 64 )
  96.  
  97.     IFND    PT__OverStep            ; Signal when module is
  98. PT__OverStep    =    0            ; finished. PT_OverStep
  99.     ENDC                    ; contains 1 if end has reached
  100.                         ; and -1 if rewound past
  101.                         ; beginning.
  102.  
  103.     IFND    PT__WindFuncs            ; Fast forward / Rewind
  104. PT__WindFuncs    =    0
  105.     ENDC
  106.  
  107.     IFND    PT__CIA                ; CIA Support
  108. PT__CIA        =    0            ; Supply CIA_SetBPM with
  109.     ENDC                    ; rate (32-255) in D0. Trash
  110.                         ; only D1/D0/A1.
  111.  
  112.     IFND    PT__68020            ; 68020+ optimisations
  113. PT__68020    =    0
  114.     ENDC
  115.  
  116.     IFND    PT__NTComp            ; Noisetracker compatibility
  117. PT__NTComp    =    1
  118.     ENDC
  119.  
  120.     IFND    PT__Channels            ; Number of channels to play
  121. PT__Channels    =    4
  122.     ENDC
  123.  
  124.     rsreset    ; Chantemp structure. Data for individual channels.
  125. PTv_Step0    rs.w    1
  126. PTv_Step2    rs.b    1
  127. PTv_Step3    rs.b    1
  128. PTv_SmpStart    rs.l    1
  129. PTv_SmpRepStart    rs.l    1
  130. PTv_WaveStart    rs.l    1
  131. PTv_MasterVol    rs.w    1
  132. PTv_SmpLength    rs.w    1
  133. PTv_SmpRepLen    rs.w    1
  134. PTv_Period    rs.w    1
  135. PTv_DMAMask    rs.w    1
  136. PTv_TPDestPer    rs.w    1
  137. PTv_SmpRealLen    rs.w    1
  138. PTv_SmpFinetune    rs.b    1
  139. PTv_SmpVolume    rs.b    1
  140. PTv_TPDir    rs.b    1
  141. PTv_TPSpeed    rs.b    1
  142. PTv_VibPara    rs.b    1
  143. PTv_VibPos    rs.b    1
  144. PTv_TremPara    rs.b    1
  145. PTv_TremPos    rs.b    1
  146. PTv_WaveCtrl    rs.b    1
  147. PTv_GlissFunk    rs.b    1
  148. PTv_SampleOffs    rs.b    1
  149. PTv_PattPos    rs.b    1
  150. PTv_LoopCount    rs.b    1
  151. PTv_FunkOffs    rs.b    1
  152. PTv_sizeof    rs.b    0
  153.  
  154.     rsreset    ; Maindata structure. Global data.
  155. PTm_SamplePtrs    rs.l    31
  156. PTm_ModulePtr    rs.l    1
  157. PTm_VibShift    rs.l    1
  158. PTm_PattPos    rs.w    1
  159. PTm_DMAConTemp    rs.w    1
  160. PTm_OverStep    rs.w    1
  161. PTm_Speed    rs.b    1
  162. PTm_Counter    rs.b    1
  163. PTm_SongPos    rs.b    1
  164. PTm_PattBrkPos    rs.b    1
  165. PTm_PosJumpFlag    rs.b    1
  166. PTm_PattBrkFlag    rs.b    1
  167. PTm_LowMask    rs.b    1
  168. PTm_PtDelTime    rs.b    1
  169. PTm_PtDelTime2    rs.b    1
  170. PTm_LoopPos    rs.b    1
  171. PTm_SyncVal    rs.b    1
  172. PTm_Pad        rs.b    1
  173. PTm_sizeof    rs.b    0
  174.  
  175. ;------------------------------------------------------------------------------
  176. ;Macro:        PT_Wait()
  177. ;Purpose:    Waits for a given number of rasterlines to expire.
  178. ;;------------------------------------------------------------------------------
  179.  
  180. PT_Wait    macro
  181.         moveq.l    #\1-1,d0
  182.         bsr.w    PT_WaitLines
  183.     endm
  184.  
  185. PT_WaitLines    lea.l    $dff006+1,a1
  186.         move.b    (a1),d7
  187.         and.b    #$f0,d7
  188. .loop1        move.b    (a1),d6
  189.         and.b    #$f0,d6
  190.         cmp.b    d7,d6
  191.         beq.s    .loop1
  192. .loop2        move.b    (a1),d6
  193.         and.b    #$f0,d6
  194.         cmp.b    d7,d6
  195.         bne.s    .loop2
  196.         dbf    d0,.loop1
  197.         rts
  198.  
  199. ;------------------------------------------------------------------------------
  200. ;Function:    PT_Init(Module)(A0)
  201. ;Purpose:    Initializes the play-routine and restarts the module if it's
  202. ;        already playing. The module may have up to 256 patterns.
  203. ;------------------------------------------------------------------------------
  204. PT_Init        lea.l    PT_MainData(pc),a4
  205.  
  206.         move.b    #0,PTm_Speed(a4)
  207.         move.l    a0,PTm_ModulePtr(a4)
  208.  
  209.         ; Find highest pattern
  210.         move.l    a0,a1
  211.         lea.l    952(a1),a1
  212.         moveq.l    #128-1,d0
  213.         moveq.l    #0,d1
  214. PT_loop        move.l    d1,d2
  215.         subq.w    #1,d0
  216. PT_loop2    move.b    (a1)+,d1
  217.         cmp.b    d2,d1
  218.         bgt.s    PT_loop
  219.         dbra    d0,PT_loop2
  220.         addq.b    #1,d2
  221.  
  222.         ; Find samplepointers and clear first word
  223.         lea.l    PTm_SamplePtrs(a4),a1    ; !Pointers to samples
  224.         lsl.l    #8,d2
  225.         lsl.l    #2,d2
  226.         add.l    #1084,d2
  227.         add.l    a0,d2
  228.         move.l    d2,a2
  229.         moveq.l    #31-1,d0
  230. PT_loop3    cmp.l    a2,a3
  231.         blt.s    .range
  232.         clr.l    (a2)
  233. .range        move.l    a2,(a1)+
  234.         moveq.l    #0,d1
  235.         move.w    42(a0),d1        ; sample length
  236.         beq.b    .nosample
  237.         lsl.l    #1,d1
  238.         add.l    d1,a2
  239. .nosample    add.l    #30,a0
  240.         dbra    d0,PT_loop3
  241.  
  242.         ; Init vibrato and loop-position if NT-mod.
  243.     ifne PT__NTComp
  244.         move.b    951(a0),d1
  245.         cmp.b    #$7f,d1
  246.         beq.s    .NotNT        ; ProTracker module
  247.         cmp.b    #$78,d1
  248.         beq.w    .NotNT        ; Old 15-instrument converted
  249.  
  250. .WasNT        move.l    #6,PTm_VibShift(a4)
  251.         move.b    d1,PTm_LoopPos(a4)
  252.         bra.s    .GotFormat
  253.  
  254. .NotNT        move.l    #7,PTm_VibShift(a4)
  255.         clr.b    PTm_LoopPos(a4)
  256. .GotFormat
  257.     endc
  258.  
  259.         lea.l    PT_chan1temp(pc),a0
  260.         moveq.l    #1,d0
  261.         moveq.l    #4-1,d1
  262. .DMALoop    move.w    d0,PTv_DMAMask(a0)
  263.         move.w    #64,PTv_MasterVol(a0)
  264.         lea.l    PTv_sizeof(a0),a0
  265.         lsl.l    #1,d0
  266.         dbf    d1,.DMALoop
  267.  
  268.  
  269.     ifne PT__CIA
  270.         moveq.l    #125,d0
  271.         bsr.s    CIA_SetBPM
  272.     endc
  273.  
  274.         or.b    #2,$bfe001
  275.         clr.b    PTm_Counter(a4)
  276.         clr.b    PTm_SongPos(a4)
  277.         clr.w    PTm_PattPos(a4)
  278.         bsr.s    PT_KillSound
  279.         move.b    #6,PTm_Speed(a4)
  280.         rts
  281.  
  282. ;------------------------------------------------------------------------------
  283. ;Function:    PT_End()
  284. ;Purpose:    Stops the music.
  285. ;------------------------------------------------------------------------------
  286. PT_End        move.b    #0,PTm_Speed(a4)
  287.  
  288. PT_KillSound    lea.l    $dff000,a0
  289.  
  290.     ifge PT__Channels-1
  291.         clr.w    $a8(a0)
  292.     endc
  293.  
  294.     ifge PT__Channels-2
  295.         clr.w    $b8(a0)
  296.     endc
  297.  
  298.     ifge PT__Channels-3
  299.         clr.w    $c8(a0)
  300.     endc
  301.  
  302.     ifge PT__Channels-4
  303.         clr.w    $d8(a0)
  304.     endc
  305.  
  306.         rts
  307.  
  308. ;------------------------------------------------------------------------------
  309. ;Function:    PT_SetMasterVol(Left,Right)(D0,D1)
  310. ;Purpose:    Sets left and right mastervolume.
  311. ;------------------------------------------------------------------------------
  312.     ifne    PT__MasterVol
  313. PT_SetMasterVol
  314.         move.w    d0,PT_chan1temp+PTv_MasterVol
  315.         move.w    d0,PT_chan4temp+PTv_MasterVol
  316.         move.w    d1,PT_chan2temp+PTv_MasterVol
  317.         move.w    d1,PT_chan3temp+PTv_MasterVol
  318.         lea.l    $dff000,a5
  319.  
  320.     ifge PT__Channels-1
  321.         moveq.l    #0,d0
  322.         lea.l    PT_chan1temp(pc),a0
  323.         move.b    PTv_SmpVolume(a0),d0
  324.         mulu.w    PTv_MasterVol(a0),d0
  325.         lsr.w    #6,d0
  326.         move.b    d0,$a8(a5)
  327.     endc
  328.  
  329.     ifge PT__Channels-2
  330.         moveq.l    #0,d0
  331.         lea.l    PT_chan2temp(pc),a0
  332.         move.b    PTv_SmpVolume(a0),d0
  333.         mulu.w    PTv_MasterVol(a0),d0
  334.         lsr.w    #6,d0
  335.         move.b    d0,$b8(a5)
  336.     endc
  337.  
  338.     ifge PT__Channels-3
  339.         moveq.l    #0,d0
  340.         lea.l    PT_chan3temp(pc),a0
  341.         move.b    PTv_SmpVolume(a0),d0
  342.         mulu.w    PTv_MasterVol(a0),d0
  343.         lsr.w    #6,d0
  344.         move.b    d0,$c8(a5)
  345.     endc
  346.  
  347.     ifge PT__Channels-4
  348.         moveq.l    #0,d0
  349.         lea.l    PT_chan4temp(pc),a0
  350.         move.b    PTv_SmpVolume(a0),d0
  351.         mulu.w    PTv_MasterVol(a0),d0
  352.         lsr.w    #6,d0
  353.         move.b    d0,$d8(a5)
  354.     endc
  355.  
  356.         moveq.l    #0,d0
  357.         rts
  358.     endc
  359.  
  360. PT_calcvol    macro
  361.  
  362.     ifne    PT__MasterVol
  363.         mulu.w    PTv_MasterVol(a6),d0
  364.         lsr.w    #6,d0
  365.     endc
  366.  
  367.     endm
  368.  
  369. ;------------------------------------------------------------------------------
  370. ;Function:    PT_Rewind()
  371. ;Purpose:    Jumps one pattern backwards.
  372. ;------------------------------------------------------------------------------
  373.     ifne    PT__WindFuncs
  374. PT_Rewind    bsr.w    PT_KillSound
  375.  
  376.         lea.l    PT_MainData(pc),a4
  377.         move.b    PTm_SongPos(a4),d0
  378.         tst.b    d0
  379.         bne.s    .not0
  380.  
  381.         move.l    PTm_ModulePtr(a4),a0    ; get moduleptr.
  382.         move.b    950(a0),PTm_SongPos(a4)
  383.         sub.b    #2,PTm_SongPos(a4)
  384.     ifne PT__OverStep
  385.         move.w    #-1,PTm_OverStep(a4)
  386.     endc
  387.         bra.s    .ok
  388.  
  389. .not0        cmp.b    #1,d0
  390.         bne.s    .not1
  391.  
  392.         move.l    PTm_ModulePtr(a4),a0    ; get moduleptr.
  393.         move.b    950(a0),PTm_SongPos(a4)
  394.         sub.b    #1,PTm_SongPos(a4)
  395.         bra.s    .ok
  396.  
  397. .not1
  398.         sub.b    #2,PTm_SongPos(a4)
  399. .ok        move.w    #63*16,PTm_PattPos(a4)
  400.         move.b    PTm_Speed(a4),PTm_Counter(a4)
  401.  
  402.         moveq.l    #0,d0
  403.         rts
  404.  
  405. ;------------------------------------------------------------------------------
  406. ;Function:    PT_Forward()
  407. ;Purpose:    Jumps one pattern forwards.
  408. ;------------------------------------------------------------------------------
  409. PT_Forward    bsr.w    PT_KillSound
  410.         lea.l    PT_MainData(pc),a4
  411.         move.w    #63*16,PTm_PattPos(a4)
  412.         move.b    PTm_Speed(a4),PTm_Counter(a4)
  413.  
  414.         moveq.l    #0,d0
  415.         rts
  416.     endc
  417.  
  418. ;------------------------------------------------------------------------------
  419. ;Function:    PT_Music()
  420. ;Purpose:    Updates the music. Call with steady intervals, preferably 50
  421. ;        times a second.
  422. ;------------------------------------------------------------------------------
  423. ;D0 -                A0 - Start of pattern
  424. ;D1 - Note offset        A1 -
  425. ;D2 -                A2 -
  426. ;D3 -                A3 -
  427. ;D4 -                A4 - MainData struct
  428. ;D5 -                A5 - Hardware registers
  429. ;D6 -                A6 - ChanTemp struct of current channel
  430. ;D7 -                A7 - [Stack pointer]
  431.  
  432. PT_Music    lea.l    PT_MainData(pc),a4
  433.         addq.b    #1,PTm_Counter(a4)
  434.         move.b    PTm_Counter(a4),d0
  435.         move.b    PTm_Speed(a4),d1
  436.         beq.w    PT_return
  437.         cmp.b    d1,d0
  438.         blo.s    PT_nonewnote
  439.         clr.b    PTm_Counter(a4)
  440.         tst.b    PTm_PtDelTime2(a4)
  441.         beq.w    PT_getnewnote
  442.         bsr.s    PT_nonewallchannels
  443.         bra.w    PT_dskip
  444.  
  445. PT_nonewnote    bsr.s    PT_nonewallchannels
  446.         bra.w    PT_nonewposyet
  447.  
  448. PT_nonewallchannels
  449.     ifge PT__Channels-1
  450.         lea.l    $dff0a0,a5
  451.         lea.l    PT_chan1temp(pc),a6
  452.         bsr.w    PT_checkefx
  453.     endc
  454.  
  455.     ifge PT__Channels-2
  456.         lea.l    $dff0b0,a5
  457.         lea.l    PT_chan2temp(pc),a6
  458.         bsr.w    PT_checkefx
  459.     endc
  460.  
  461.     ifge PT__Channels-3
  462.         lea.l    $dff0c0,a5
  463.         lea.l    PT_chan3temp(pc),a6
  464.         bsr.w    PT_checkefx
  465.     endc
  466.  
  467.     ifge PT__Channels-4
  468.         lea.l    $dff0d0,a5
  469.         lea.l    PT_chan4temp(pc),a6
  470.         bsr.w    PT_checkefx
  471.     endc
  472.         rts
  473.  
  474. PT_getnewnote    move.l    PTm_ModulePtr(a4),a0
  475.         lea.l    12(a0),a3
  476.         lea.l    952(a0),a2        ;pattpo
  477.         lea.l    1084(a0),a0        ;patterndata
  478.         moveq.l    #0,d0
  479.         moveq.l    #0,d1
  480.         move.b    PTm_SongPos(a4),d0
  481.         move.b    (a2,d0.w),d1
  482.         lsl.l    #8,d1
  483.         lsl.l    #2,d1
  484.         add.w    PTm_PattPos(a4),d1
  485.         clr.w    PTm_DMAConTemp(a4)
  486.  
  487.         ; !(a0,d1) points to the patterndata
  488.  
  489.     ifge PT__Channels-1
  490.         lea.l    $dff0a0,a5
  491.         lea.l    PT_chan1temp(pc),a6
  492.         bsr.s    PT_playvoice
  493.     endc
  494.  
  495.     ifge PT__Channels-2
  496.         lea.l    $dff0b0,a5
  497.         lea.l    PT_chan2temp(pc),a6
  498.         bsr.s    PT_playvoice
  499.     endc
  500.  
  501.     ifge PT__Channels-3
  502.         lea.l    $dff0c0,a5
  503.         lea.l    PT_chan3temp(pc),a6
  504.         bsr.s    PT_playvoice
  505.     endc
  506.  
  507.     ifge PT__Channels-4
  508.         lea.l    $dff0d0,a5
  509.         lea.l    PT_chan4temp(pc),a6
  510.         bsr.s    PT_playvoice
  511.     endc
  512.  
  513.         bra.w    PT_setdma
  514.  
  515. PT_playvoice    tst.w    PTv_Step0(a6)
  516.         bne.s    PT_plvskip
  517.         bsr.w    PT_pernop
  518.  
  519. PT_plvskip    move.l    (a0,d1.l),PTv_Step0(a6)
  520.         addq.l    #4,d1
  521.         moveq.l    #0,d2
  522.         move.b    PTv_Step2(a6),d2
  523.         and.b    #$f0,d2
  524.         lsr.b    #4,d2
  525.         move.b    PTv_Step0(a6),d0
  526.         and.b    #$f0,d0
  527.         or.b    d0,d2
  528.         tst.b    d2
  529.         beq.w    PT_setregs
  530.         moveq.l    #0,d3
  531.         lea.l    PTm_SamplePtrs(a4),a1
  532.         move.w    d2,d4
  533.         subq.l    #1,d2
  534.  
  535.         move.w    d4,d3            ; *30
  536.         lsl.w    #5,d4
  537.         add.w    d3,d3
  538.         sub.w    d3,d4
  539.  
  540.     ifeq    PT__68020
  541.         lsl.l    #2,d2
  542.         move.l    (a1,d2.l),PTv_SmpStart(a6)
  543.     else
  544.         move.l    (a1,d2.l*4),PTv_SmpStart(a6)
  545.     endc
  546.  
  547.         move.w    (a3,d4.l),PTv_SmpLength(a6)
  548.         move.w    (a3,d4.l),PTv_SmpRealLen(a6)
  549.         move.b    2(a3,d4.l),PTv_SmpFinetune(a6)
  550.         move.b    3(a3,d4.l),PTv_SmpVolume(a6)
  551.         move.w    4(a3,d4.l),d3        ; get repeat
  552.         tst.w    d3
  553.         beq.s    PT_noloop
  554.         move.l    PTv_SmpStart(a6),d2    ; get start
  555.         add.w    d3,d3
  556.         add.l    d3,d2            ; add repeat
  557.         move.l    d2,PTv_SmpRepStart(a6)
  558.         move.l    d2,PTv_WaveStart(a6)
  559.         move.w    4(a3,d4.l),d0        ; get repeat
  560.         add.w    6(a3,d4.l),d0        ; add replen
  561.         move.w    d0,PTv_SmpLength(a6)
  562.         move.w    6(a3,d4.l),PTv_SmpRepLen(a6); save replen
  563.         moveq.l    #0,d0
  564.         move.b    PTv_SmpVolume(a6),d0
  565.  
  566.         PT_calcvol
  567.  
  568.         move.w    d0,8(a5)        ; set volume
  569.         bra.s    PT_setregs
  570.  
  571. PT_noloop    move.l    PTv_SmpStart(a6),d2
  572.         add.l    d3,d2
  573.         move.l    d2,PTv_SmpRepStart(a6)
  574.         move.l    d2,PTv_WaveStart(a6)
  575.         move.w    6(a3,d4.l),PTv_SmpRepLen(a6)    ; save replen
  576.         moveq.l    #0,d0
  577.         move.b    PTv_SmpVolume(a6),d0
  578.  
  579.         PT_calcvol
  580.  
  581.         move.w    d0,8(a5)        ; set volume
  582.  
  583.         ; A new note is supposed to be played
  584. PT_setregs    move.w    PTv_Step0(a6),d0
  585.         and.w    #$0fff,d0
  586.         beq.w    PT_checkmoreefx        ; if no note
  587.         move.w    PTv_Step2(a6),d0
  588.         and.w    #$0ff0,d0
  589.         cmp.w    #$0e50,d0
  590.         beq.s    PT_dosetfinetune
  591.         move.b    PTv_Step2(a6),d0
  592.         and.b    #$0f,d0
  593.         cmp.b    #3,d0            ; toneportamento
  594.         beq.s    PT_chktoneporta
  595.         cmp.b    #5,d0
  596.         beq.s    PT_chktoneporta
  597.         cmp.b    #9,d0            ; sample offset
  598.         bne.s    PT_setperiod
  599.         bsr.w    PT_checkmoreefx
  600.         bra.s    PT_setperiod
  601.  
  602. PT_dosetfinetune
  603.         bsr.w    PT_setfinetune
  604.         bra.s    PT_setperiod
  605.  
  606. PT_chktoneporta
  607.         bsr.w    PT_settoneporta
  608.         bra.w    PT_checkmoreefx
  609.  
  610. PT_setperiod    move.w    PTv_Step0(a6),d7
  611.         and.w    #$0fff,d7
  612.         lea.l    PT_periodtable(pc),a1
  613.         moveq.l    #0,d0
  614.         moveq.l    #36,d2
  615. PT_ftuloop    cmp.w    (a1,d0.w),d7
  616.         bhs.s    PT_ftufound
  617.         addq.l    #2,d0
  618.         dbra    d2,PT_ftuloop
  619. PT_ftufound    moveq.l    #0,d7
  620.         move.b    PTv_SmpFinetune(a6),d7
  621.         mulu.w    #36*2,d7
  622.         add.l    d7,a1
  623.         move.w    (a1,d0.w),PTv_Period(a6)
  624.  
  625.         move.w    PTv_Step2(a6),d0
  626.         and.w    #$0ff0,d0
  627.         cmp.w    #$0ed0,d0        ; notedelay
  628.         beq.w    PT_checkmoreefx
  629.  
  630.         move.w    PTv_DMAMask(a6),$dff096    ; Shut off DMA
  631.         PT_Wait    1            ; Wait for DMA to come off
  632.  
  633.         btst    #2,PTv_WaveCtrl(a6)
  634.         bne.s    PT_vibnoc
  635.         clr.b    PTv_VibPos(a6)
  636.  
  637. PT_vibnoc    btst    #6,PTv_WaveCtrl(a6)
  638.         bne.s    PT_trenoc
  639.         clr.b    PTv_TremPos(a6)
  640.  
  641. PT_trenoc    move.l    PTv_SmpStart(a6),(a5)    ; set start
  642.         move.w    PTv_SmpLength(a6),4(a5)    ; set length
  643.         move.w    PTv_Period(a6),d0
  644.         move.w    d0,6(a5)        ; set period
  645.         move.w    PTv_DMAMask(a6),d0
  646.         or.w    d0,PTm_DMAConTemp(a4)
  647.         bra.w    PT_checkmoreefx
  648.  
  649. PT_setdma    lea.l    $bfe000,a5
  650.  
  651.         PT_Wait    4            ; Wait for auddat to be fetched
  652.  
  653.         move.w    PTm_DMAConTemp(a4),d0
  654.         or.w    #$8000,d0
  655.         move.w    d0,$dff096        ; Enable audio DMA
  656.  
  657.         PT_Wait    1            ; Wait for DMA to start
  658.  
  659.         lea.l    $dff000,a5
  660.  
  661.     ifge PT__Channels-1
  662.         lea.l    PT_chan1temp(pc),a6
  663.         move.l    PTv_SmpRepStart(a6),$a0(a5)
  664.         move.w    PTv_SmpRepLen(a6),$a4(a5)
  665.     endc
  666.  
  667.     ifge PT__Channels-2
  668.         lea.l    PT_chan2temp(pc),a6
  669.         move.l    PTv_SmpRepStart(a6),$b0(a5)
  670.         move.w    PTv_SmpRepLen(a6),$b4(a5)
  671.     endc
  672.  
  673.     ifge PT__Channels-3
  674.         lea.l    PT_chan3temp(pc),a6
  675.         move.l    PTv_SmpRepStart(a6),$c0(a5)
  676.         move.w    PTv_SmpRepLen(a6),$c4(a5)
  677.     endc
  678.  
  679.     ifge PT__Channels-4
  680.         lea.l    PT_chan4temp(pc),a6
  681.         move.l    PTv_SmpRepStart(a6),$d0(a5)
  682.         move.w    PTv_SmpRepLen(a6),$d4(a5)
  683.     endc
  684.  
  685. PT_dskip    add.w    #16,PTm_PattPos(a4)
  686.         move.b    PTm_PtDelTime(a4),d0
  687.         beq.s    PT_dskc
  688.         move.b    d0,PTm_PtDelTime2(a4)
  689.         clr.b    PTm_PtDelTime(a4)
  690.  
  691. PT_dskc        tst.b    PTm_PtDelTime2(a4)
  692.         beq.s    PT_dska
  693.         subq.b    #1,PTm_PtDelTime2(a4)
  694.         beq.s    PT_dska
  695.         sub.w    #16,PTm_PattPos(a4)
  696.  
  697. PT_dska        tst.b    PTm_PattBrkFlag(a4)
  698.         beq.s    PT_nnpysk
  699.         sf    PTm_PattBrkFlag(a4)
  700.         moveq.l    #0,d0
  701.         move.b    PTm_PattBrkPos(a4),d0
  702.         clr.b    PTm_PattBrkPos(a4)
  703.  
  704.         lsl.w    #4,d0
  705.         move.w    d0,PTm_PattPos(a4)
  706.  
  707. PT_nnpysk    cmp.w    #1024,PTm_PattPos(a4)
  708.         blo.s    PT_nonewposyet
  709.  
  710. PT_nextposition
  711.         moveq.l    #0,d0
  712.         move.b    PTm_PattBrkPos(a4),d0
  713.         move.w    d0,PTm_PattPos(a4)
  714.         clr.b    PTm_PattBrkPos(a4)
  715.         clr.b    PTm_PosJumpFlag(a4)
  716.         addq.b    #1,PTm_SongPos(a4)
  717.         and.b    #$7f,PTm_SongPos(a4)
  718.         move.b    PTm_SongPos(a4),d1
  719.  
  720.         move.l    PTm_ModulePtr(a4),a0
  721.         cmp.b    950(a0),d1
  722.         blo.s    PT_nonewposyet
  723.     ifne PT__OverStep
  724.         move.w    #1,PTm_OverStep(a4)
  725.     endc
  726.     ifne PT__NTComp
  727.         move.b    PTm_LoopPos(a4),PTm_SongPos(a4)
  728.     else
  729.         clr.b    PTm_SongPos(a4)
  730.     endc
  731.  
  732. PT_nonewposyet
  733.         tst.b    PTm_PosJumpFlag(a4)
  734.         bne.s    PT_nextposition
  735. PT_return    rts
  736.  
  737. PT_checkefx    bsr.w    PT_updatefunk
  738.         move.w    PTv_Step2(a6),d0
  739.         and.w    #$0fff,d0
  740.         beq.s    PT_pernop
  741.         move.b    PTv_Step2(a6),d0
  742.         and.b    #$0f,d0
  743.         beq.s    PT_arpeggio
  744.         cmp.b    #1,d0
  745.         beq.w    PT_portaup
  746.         cmp.b    #2,d0
  747.         beq.w    PT_portadown
  748.         cmp.b    #3,d0
  749.         beq.w    PT_toneportamento
  750.         cmp.b    #4,d0
  751.         beq.w    PT_vibrato
  752.         cmp.b    #5,d0
  753.         beq.w    PT_toneplusvolslide
  754.         cmp.b    #6,d0
  755.         beq.w    PT_vibratoplusvolslide
  756.         cmp.b    #$e,d0
  757.         beq.w    PT_e_commands
  758. setback        move.w    PTv_Period(a6),6(a5)
  759.         cmp.b    #7,d0
  760.         beq.w    PT_tremolo
  761.         cmp.b    #$a,d0
  762.         beq.w    PT_volumeslide
  763.         rts
  764.  
  765. PT_pernop    move.w    PTv_Period(a6),6(a5)
  766.         rts
  767.  
  768. PT_arpeggio    moveq.l    #0,d0
  769.         move.b    PTm_Counter(a4),d0
  770.         divs.w    #3,d0
  771.         swap.w    d0
  772.         tst.w    d0
  773.         beq.s    PT_arpeggio2
  774.         cmp.w    #2,d0
  775.         beq.s    PT_arpeggio1
  776.         moveq.l    #0,d0
  777.         move.b    PTv_Step3(a6),d0
  778.         lsr.b    #4,d0
  779.         bra.s    PT_arpeggio3
  780.  
  781. PT_arpeggio1    moveq.l    #0,d0
  782.         move.b    PTv_Step3(a6),d0
  783.         and.b    #15,d0
  784.         bra.s    PT_arpeggio3
  785.  
  786. PT_arpeggio2    move.w    PTv_Period(a6),d2
  787.         bra.s    PT_arpeggio4
  788.  
  789. PT_arpeggio3    add.w    d0,d0
  790.         moveq.l    #0,d1
  791.         move.b    PTv_SmpFinetune(a6),d1
  792.         mulu.w    #36*2,d1
  793.         lea.l    PT_periodtable(pc),a0
  794.         add.l    d1,a0
  795.         moveq.l    #0,d1
  796.         move.w    PTv_Period(a6),d1
  797.         moveq.l    #36,d3
  798.  
  799. PT_arploop    move.w    (a0,d0.w),d2
  800.         cmp.w    (a0),d1
  801.         bhs.s    PT_arpeggio4
  802.         addq.l    #2,a0
  803.         dbra    d3,PT_arploop
  804.         rts
  805.  
  806. PT_arpeggio4    move.w    d2,6(a5)
  807.         rts
  808.  
  809. PT_fineportaup    tst.b    PTm_Counter(a4)
  810.         bne.w    PT_return
  811.         move.b    #$0f,PTm_LowMask(a4)
  812.  
  813. PT_portaup    moveq.l    #0,d0
  814.         move.b    PTv_Step3(a6),d0
  815.         and.b    PTm_LowMask(a4),d0
  816.         move.b    #$ff,PTm_LowMask(a4)
  817.         sub.w    d0,PTv_Period(a6)
  818.         move.w    PTv_Period(a6),d0
  819.         and.w    #$0fff,d0
  820.         cmp.w    #113,d0
  821.         bpl.s    PT_portauskip
  822.         and.w    #$f000,PTv_Period(a6)
  823.         or.w    #113,PTv_Period(a6)
  824.  
  825. PT_portauskip    move.w    PTv_Period(a6),d0
  826.         and.w    #$0fff,d0
  827.         move.w    d0,6(a5)
  828.         rts
  829.  
  830. PT_fineportadown
  831.         tst.b    PTm_Counter(a4)
  832.         bne.w    PT_return
  833.         move.b    #$0f,PTm_LowMask(a4)
  834.  
  835. PT_portadown    clr.w    d0
  836.         move.b    PTv_Step3(a6),d0
  837.         and.b    PTm_LowMask(a4),d0
  838.         move.b    #$ff,PTm_LowMask(a4)
  839.         add.w    d0,PTv_Period(a6)
  840.         move.w    PTv_Period(a6),d0
  841.         and.w    #$0fff,d0
  842.         cmp.w    #856,d0
  843.         bmi.s    PT_portadskip
  844.         and.w    #$f000,PTv_Period(a6)
  845.         or.w    #856,PTv_Period(a6)
  846.  
  847. PT_portadskip    move.w    PTv_Period(a6),d0
  848.         and.w    #$0fff,d0
  849.         move.w    d0,6(a5)
  850.         rts
  851.  
  852. PT_settoneporta
  853.         move.l    a0,-(sp)
  854.         move.w    PTv_Step0(a6),d2
  855.         and.w    #$0fff,d2
  856.         moveq.l    #0,d0
  857.         move.b    PTv_SmpFinetune(a6),d0
  858.         mulu.w    #37*2,d0
  859.         lea.l    PT_periodtable(pc),a0
  860.         add.l    d0,a0
  861.         moveq.l    #0,d0
  862.  
  863. PT_stploop    cmp.w    (a0,d0.w),d2
  864.         bhs.s    PT_stpfound
  865.         addq.w    #2,d0
  866.         cmp.w    #37*2,d0
  867.         blo.s    PT_stploop
  868.         moveq.l    #35*2,d0
  869.  
  870. PT_stpfound    move.b    PTv_SmpFinetune(a6),d2
  871.         and.b    #8,d2
  872.         beq.s    PT_stpgoss
  873.         tst.w    d0
  874.         beq.s    PT_stpgoss
  875.         subq.w    #2,d0
  876.  
  877. PT_stpgoss    move.w    (a0,d0.w),d2
  878.         move.l    (sp)+,a0
  879.         move.w    d2,PTv_TPDestPer(a6)
  880.         move.w    PTv_Period(a6),d0
  881.         clr.b    PTv_TPDir(a6)
  882.         cmp.w    d0,d2
  883.         beq.s    PT_cleartoneporta
  884.         bge.w    PT_return
  885.         move.b    #1,PTv_TPDir(a6)
  886.         rts
  887.  
  888. PT_cleartoneporta
  889.         clr.w    PTv_TPDestPer(a6)
  890.         rts
  891.  
  892. PT_toneportamento
  893.         move.b    PTv_Step3(a6),d0
  894.         beq.s    PT_toneportnochange
  895.         move.b    d0,PTv_TPSpeed(a6)
  896.         clr.b    PTv_Step3(a6)
  897.  
  898. PT_toneportnochange
  899.         tst.w    PTv_TPDestPer(a6)
  900.         beq.w    PT_return
  901.         moveq.l    #0,d0
  902.         move.b    PTv_TPSpeed(a6),d0
  903.         tst.b    PTv_TPDir(a6)
  904.         bne.s    PT_toneportaup
  905.  
  906. PT_toneportadown
  907.         add.w    d0,PTv_Period(a6)
  908.         move.w    PTv_TPDestPer(a6),d0
  909.         cmp.w    PTv_Period(a6),d0
  910.         bgt.s    PT_toneportasetper
  911.         move.w    PTv_TPDestPer(a6),PTv_Period(a6)
  912.         clr.w    PTv_TPDestPer(a6)
  913.         bra.s    PT_toneportasetper
  914.  
  915. PT_toneportaup
  916.         sub.w    d0,PTv_Period(a6)
  917.         move.w    PTv_TPDestPer(a6),d0
  918.         cmp.w    PTv_Period(a6),d0
  919.         blt.s    PT_toneportasetper
  920.         move.w    PTv_TPDestPer(a6),PTv_Period(a6)
  921.         clr.w    PTv_TPDestPer(a6)
  922.  
  923. PT_toneportasetper
  924.         move.w    PTv_Period(a6),d2
  925.         move.b    PTv_GlissFunk(a6),d0
  926.         and.b    #$0f,d0
  927.         beq.s    PT_glissskip
  928.         moveq.l    #0,d0
  929.         move.b    PTv_SmpFinetune(a6),d0
  930.         mulu.w    #36*2,d0
  931.         lea.l    PT_periodtable(pc),a0
  932.         add.l    d0,a0
  933.         moveq.l    #0,d0
  934.  
  935. PT_glissloop    cmp.w    (a0,d0.w),d2
  936.         bhs.s    PT_glissfound
  937.         addq.w    #2,d0
  938.         cmp.w    #36*2,d0
  939.         blo.s    PT_glissloop
  940.         moveq.l    #35*2,d0
  941.  
  942. PT_glissfound    move.w    (a0,d0.w),d2
  943.  
  944. PT_glissskip    move.w    d2,6(a5)        ; set period
  945.         rts
  946.  
  947. PT_vibrato    move.b    PTv_Step3(a6),d0
  948.         beq.s    PT_vibrato2
  949.         move.b    PTv_VibPara(a6),d2
  950.         and.b    #$0f,d0
  951.         beq.s    PT_vibskip
  952.         and.b    #$f0,d2
  953.         or.b    d0,d2
  954.  
  955. PT_vibskip    move.b    PTv_Step3(a6),d0
  956.         and.b    #$f0,d0
  957.         beq.s    PT_vibskip2
  958.         and.b    #$0f,d2
  959.         or.b    d0,d2
  960.  
  961. PT_vibskip2    move.b    d2,PTv_VibPara(a6)
  962.  
  963. PT_vibrato2    move.b    PTv_VibPos(a6),d0
  964.         lea.l    PT_vibratotable(pc),a1
  965.         lsr.w    #2,d0
  966.         and.w    #$001f,d0
  967.         moveq.l    #0,d2
  968.         move.b    PTv_WaveCtrl(a6),d2
  969.         and.b    #$03,d2
  970.         beq.s    PT_vib_sine
  971.         lsl.b    #3,d0
  972.         cmp.b    #1,d2
  973.         beq.s    PT_vib_rampdown
  974.         move.b    #255,d2
  975.         bra.s    PT_vib_set
  976.  
  977. PT_vib_rampdown
  978.         tst.b    PTv_VibPos(a6)
  979.         bpl.s    PT_vib_rampdown2
  980.         move.b    #255,d2
  981.         sub.b    d0,d2
  982.         bra.s    PT_vib_set
  983.  
  984. PT_vib_rampdown2
  985.         move.b    d0,d2
  986.         bra.s    PT_vib_set
  987.  
  988. PT_vib_sine    move.b    (a1,d0.w),d2
  989.  
  990. PT_vib_set    move.b    PTv_VibPara(a6),d0
  991.         and.w    #15,d0
  992.         mulu.w    d0,d2
  993.     ifne PT__NTComp
  994.         move.l    PTm_VibShift(a4),d0
  995.         lsr.w    d0,d2
  996.     else
  997.         lsr.w    #7,d2
  998.     endc
  999.         move.w    PTv_Period(a6),d0
  1000.         tst.b    PTv_VibPos(a6)
  1001.         bmi.s    PT_vibratoneg
  1002.         add.w    d2,d0
  1003.         bra.s    PT_vibrato3
  1004.  
  1005. PT_vibratoneg    sub.w    d2,d0
  1006.  
  1007. PT_vibrato3    move.w    d0,6(a5)
  1008.         move.b    PTv_VibPara(a6),d0
  1009.         lsr.w    #2,d0
  1010.         and.w    #$003c,d0
  1011.         add.b    d0,PTv_VibPos(a6)
  1012.         rts
  1013.  
  1014. PT_toneplusvolslide
  1015.         bsr.w    PT_toneportnochange
  1016.         bra.w    PT_volumeslide
  1017.  
  1018. PT_vibratoplusvolslide
  1019.         bsr.s    PT_vibrato2
  1020.         bra.w    PT_volumeslide
  1021.  
  1022. PT_tremolo    move.b    PTv_Step3(a6),d0
  1023.         beq.s    PT_tremolo2
  1024.         move.b    PTv_TremPara(a6),d2
  1025.         and.b    #$0f,d0
  1026.         beq.s    PT_treskip
  1027.         and.b    #$f0,d2
  1028.         or.b    d0,d2
  1029.  
  1030. PT_treskip    move.b    PTv_Step3(a6),d0
  1031.         and.b    #$f0,d0
  1032.         beq.s    PT_treskip2
  1033.         and.b    #$0f,d2
  1034.         or.b    d0,d2
  1035.  
  1036. PT_treskip2    move.b    d2,PTv_TremPara(a6)
  1037.  
  1038. PT_tremolo2    move.b    PTv_TremPos(a6),d0
  1039.         lea.l    PT_vibratotable(pc),a1
  1040.         lsr.w    #2,d0
  1041.         and.w    #$001f,d0
  1042.         moveq.l    #0,d2
  1043.         move.b    PTv_WaveCtrl(a6),d2
  1044.         lsr.b    #4,d2
  1045.         and.b    #$03,d2
  1046.         beq.s    PT_tre_sine
  1047.         lsl.b    #3,d0
  1048.         cmp.b    #1,d2
  1049.         beq.s    PT_tre_rampdown
  1050.         move.b    #255,d2
  1051.         bra.s    PT_tre_set
  1052.  
  1053. PT_tre_rampdown
  1054.         tst.b    PTv_VibPos(a6)
  1055.         bpl.s    PT_tre_rampdown2
  1056.         move.b    #255,d2
  1057.         sub.b    d0,d2
  1058.         bra.s    PT_tre_set
  1059.  
  1060. PT_tre_rampdown2
  1061.         move.b    d0,d2
  1062.         bra.s    PT_tre_set
  1063.  
  1064. PT_tre_sine    move.b    (a1,d0.w),d2
  1065.  
  1066. PT_tre_set    move.b    PTv_TremPara(a6),d0
  1067.         and.w    #15,d0
  1068.         mulu.w    d0,d2
  1069.         lsr.w    #6,d2
  1070.         moveq.l    #0,d0
  1071.         move.b    PTv_SmpVolume(a6),d0
  1072.         tst.b    PTv_TremPos(a6)
  1073.         bmi.s    PT_tremoloneg
  1074.         add.w    d2,d0
  1075.         bra.s    PT_tremolo3
  1076.  
  1077. PT_tremoloneg    sub.w    d2,d0
  1078.  
  1079. PT_tremolo3    bpl.s    PT_tremoloskip
  1080.         clr.w    d0
  1081.  
  1082. PT_tremoloskip
  1083.         cmp.w    #$40,d0
  1084.         bls.s    PT_tremolook
  1085.         move.w    #$40,d0
  1086.  
  1087. PT_tremolook    PT_calcvol
  1088.  
  1089.         move.w    d0,8(a5)
  1090.         move.b    PTv_TremPara(a6),d0
  1091.         lsr.w    #2,d0
  1092.         and.w    #$003c,d0
  1093.         add.b    d0,PTv_TremPos(a6)
  1094.         rts
  1095.  
  1096. PT_syncval
  1097.         move.b    PTv_Step3(a6),PTm_syncval(a4)
  1098.         rts
  1099.  
  1100. PT_sampleoffset
  1101.         moveq.l    #0,d0
  1102.         move.b    PTv_Step3(a6),d0
  1103.         beq.s    PT_sononew
  1104.         move.b    d0,PTv_SampleOffs(a6)
  1105.  
  1106. PT_sononew    move.b    PTv_SampleOffs(a6),d0
  1107.         lsl.w    #7,d0
  1108.         cmp.w    PTv_SmpLength(a6),d0
  1109.         bge.s    PT_sofskip
  1110.         sub.w    d0,PTv_SmpLength(a6)
  1111.         add.w    d0,d0
  1112.         add.l    d0,PTv_SmpStart(a6)
  1113.         rts
  1114.  
  1115. PT_sofskip    move.w    #$0001,PTv_SmpLength(a6)
  1116.         rts
  1117.  
  1118. PT_volumeslide
  1119.         moveq.l    #0,d0
  1120.         move.b    PTv_Step3(a6),d0
  1121.         lsr.b    #4,d0
  1122.         tst.b    d0
  1123.         beq.s    PT_volslidedown
  1124.  
  1125. PT_volslideup    add.b    d0,PTv_SmpVolume(a6)
  1126.         cmp.b    #$40,PTv_SmpVolume(a6)
  1127.         bmi.s    PT_vsuskip
  1128.         move.b    #$40,PTv_SmpVolume(a6)
  1129.  
  1130. PT_vsuskip    move.b    PTv_SmpVolume(a6),d0
  1131.  
  1132.         PT_calcvol
  1133.  
  1134.         move.w    d0,8(a5)
  1135.         rts
  1136.  
  1137. PT_volslidedown
  1138.         moveq.l    #0,d0
  1139.         move.b    PTv_Step3(a6),d0
  1140.         and.b    #$0f,d0
  1141.  
  1142. PT_volslidedown2
  1143.         sub.b    d0,PTv_SmpVolume(a6)
  1144.         bpl.s    PT_vsdskip
  1145.         clr.b    PTv_SmpVolume(a6)
  1146.  
  1147. PT_vsdskip    moveq.l    #0,d0
  1148.         move.b    PTv_SmpVolume(a6),d0
  1149.  
  1150.         PT_calcvol
  1151.  
  1152.         move.w    d0,8(a5)
  1153.         rts
  1154.  
  1155. PT_positionjump
  1156.         move.b    PTv_Step3(a6),d0
  1157.         subq.b    #1,d0
  1158.         move.b    d0,PTm_SongPos(a4)
  1159.     ifne PT__OverStep
  1160.         move.w    #1,PTm_OverStep(a4)
  1161.     endc
  1162. PT_pj2        clr.b    PTm_PattBrkPos(a4)
  1163.         st    PTm_PosJumpFlag(a4)
  1164.         rts
  1165.  
  1166. PT_volumechange
  1167.         moveq.l    #0,d0
  1168.         move.b    PTv_Step3(a6),d0
  1169.         cmp.b    #$40,d0
  1170.         bls.s    PT_volumeok
  1171.         moveq.l    #$40,d0
  1172.  
  1173. PT_volumeok    move.b    d0,PTv_SmpVolume(a6)
  1174.  
  1175.         PT_calcvol
  1176.  
  1177.         move.w    d0,8(a5)
  1178.         rts
  1179.  
  1180. PT_patternbreak
  1181.         moveq.l    #0,d0
  1182.         move.b    PTv_Step3(a6),d0
  1183.         move.l    d0,d2
  1184.         lsr.b    #4,d0
  1185.         mulu.w    #10,d0
  1186.         and.b    #$0f,d2
  1187.         add.b    d2,d0
  1188.         cmp.b    #63,d0
  1189.         bhi.s    PT_pj2
  1190.         move.b    d0,PTm_PattBrkPos(a4)
  1191.         st    PTm_PosJumpFlag(a4)
  1192.         rts
  1193.  
  1194. PT_setspeed
  1195.         moveq.l    #0,d0
  1196.         move.b    PTv_Step3(a6),d0
  1197.  
  1198.     ifne PT__OverStep
  1199.         bne.s    .wasnotzero
  1200.         move.w    #1,PTm_OverStep(a4)
  1201. .wasnotzero
  1202.     endc
  1203.  
  1204.     ifne    PT__CIA
  1205.         cmp.b    #32,d0
  1206.         blo.s    .setspeed
  1207.  
  1208. .settempo    bsr.w    CIA_SetBPM
  1209.         rts
  1210.  
  1211.     endc
  1212.  
  1213. .setspeed    clr.b    PTm_Counter(a4)
  1214.         move.b    d0,PTm_Speed(a4)
  1215.         rts
  1216.  
  1217. PT_checkmoreefx
  1218.         bsr.w    PT_updatefunk
  1219.         move.b    PTv_Step2(a6),d0
  1220.         and.b    #$0f,d0
  1221.         cmp.b    #$8,d0
  1222.         beq.s    PT_syncval
  1223.         cmp.b    #$9,d0
  1224.         beq.w    PT_sampleoffset
  1225.         cmp.b    #$b,d0
  1226.         beq.w    PT_positionjump
  1227.         cmp.b    #$d,d0
  1228.         beq.w    PT_patternbreak
  1229.         cmp.b    #$e,d0
  1230.         beq.s    PT_e_commands
  1231.         cmp.b    #$f,d0
  1232.         beq.w    PT_setspeed
  1233.         cmp.b    #$c,d0
  1234.         beq.w    PT_volumechange
  1235.         bra.w    PT_pernop
  1236.  
  1237. PT_e_commands    move.b    PTv_Step3(a6),d0
  1238.         and.b    #$f0,d0
  1239.         lsr.b    #4,d0
  1240.         beq.s    PT_filteronoff
  1241.         cmp.b    #1,d0
  1242.         beq.w    PT_fineportaup
  1243.         cmp.b    #2,d0
  1244.         beq.w    PT_fineportadown
  1245.         cmp.b    #3,d0
  1246.         beq.s    PT_setglisscontrol
  1247.         cmp.b    #4,d0
  1248.         beq.w    PT_setvibratocontrol
  1249.         cmp.b    #5,d0
  1250.         beq.w    PT_setfinetune
  1251.         cmp.b    #6,d0
  1252.         beq.w    PT_jumploop
  1253.         cmp.b    #7,d0
  1254.         beq.w    PT_settremolocontrol
  1255.         cmp.b    #9,d0
  1256.         beq.w    PT_retrignote
  1257.         cmp.b    #$a,d0
  1258.         beq.w    PT_volumefineup
  1259.         cmp.b    #$b,d0
  1260.         beq.w    PT_volumefinedown
  1261.         cmp.b    #$c,d0
  1262.         beq.w    PT_notecut
  1263.         cmp.b    #$d,d0
  1264.         beq.w    PT_notedelay
  1265.         cmp.b    #$e,d0
  1266.         beq.w    PT_patterndelay
  1267.         cmp.b    #$f,d0
  1268.         beq.w    PT_funkit
  1269.         rts
  1270.  
  1271. PT_filteronoff
  1272.         move.b    PTv_Step3(a6),d0
  1273.         and.b    #1,d0
  1274.         add.b    d0,d0
  1275.         and.b    #$fd,$bfe001
  1276.         or.b    d0,$bfe001
  1277.         rts    
  1278.  
  1279. PT_setglisscontrol
  1280.         move.b    PTv_Step3(a6),d0
  1281.         and.b    #$0f,d0
  1282.         and.b    #$f0,PTv_GlissFunk(a6)
  1283.         or.b    d0,PTv_GlissFunk(a6)
  1284.         rts
  1285.  
  1286. PT_setvibratocontrol
  1287.         move.b    PTv_Step3(a6),d0
  1288.         and.b    #$0f,d0
  1289.         and.b    #$f0,PTv_WaveCtrl(a6)
  1290.         or.b    d0,PTv_WaveCtrl(a6)
  1291.         rts
  1292.  
  1293. PT_setfinetune
  1294.         move.b    PTv_Step3(a6),d0
  1295.         and.b    #$0f,d0
  1296.         move.b    d0,PTv_SmpFinetune(a6)
  1297.         rts
  1298.  
  1299. PT_jumploop    tst.b    PTm_Counter(a4)
  1300.         bne.w    PT_return
  1301.         move.b    PTv_Step3(a6),d0
  1302.         and.b    #$0f,d0
  1303.         beq.s    PT_setloop
  1304.         tst.b    PTv_LoopCount(a6)
  1305.         beq.s    PT_jumpcnt
  1306.         subq.b    #1,PTv_LoopCount(a6)
  1307.         beq.w    PT_return
  1308.  
  1309. PT_jmploop    move.b    PTv_PattPos(a6),PTm_PattBrkPos(a4)
  1310.         st    PTm_PattBrkFlag(a4)
  1311.         rts
  1312.  
  1313. PT_jumpcnt    move.b    d0,PTv_LoopCount(a6)
  1314.         bra.s    PT_jmploop
  1315.  
  1316. PT_setloop    move.w    PTm_PattPos(a4),d0
  1317.         lsr.w    #4,d0
  1318.         move.b    d0,PTv_PattPos(a6)
  1319.         rts
  1320.  
  1321. PT_settremolocontrol
  1322.         move.b    PTv_Step3(a6),d0
  1323.         and.b    #$0f,d0
  1324.         lsl.b    #4,d0
  1325.         and.b    #$0f,PTv_WaveCtrl(a6)
  1326.         or.b    d0,PTv_WaveCtrl(a6)
  1327.         rts
  1328.  
  1329. PT_retrignote    move.l    d1,-(sp)
  1330.         moveq.l    #0,d0
  1331.         move.b    PTv_Step3(a6),d0
  1332.         and.b    #$0f,d0
  1333.         beq.s    PT_rtnend
  1334.         moveq.l    #0,d1
  1335.         move.b    PTm_Counter(a4),d1
  1336.         bne.s    PT_rtnskp
  1337.         move.w    PTv_Step0(a6),d1
  1338.         and.w    #$0fff,d1
  1339.         bne.s    PT_rtnend
  1340.         moveq.l    #0,d1
  1341.         move.b    PTm_Counter(a4),d1
  1342.  
  1343. PT_rtnskp    divu.w    d0,d1
  1344.         swap.w    d1
  1345.         tst.w    d1
  1346.         bne.s    PT_rtnend
  1347.  
  1348. PT_doretrig    move.w    PTv_DMAMask(a6),$dff096    ; channel dma off
  1349.         move.l    PTv_SmpStart(a6),(a5)    ; set sampledata pointer
  1350.         move.w    PTv_SmpLength(a6),4(a5)    ; set length
  1351.         move.w    #300,d0
  1352.  
  1353. PT_rtnloop1    dbra    d0,PT_rtnloop1
  1354.         move.w    PTv_DMAMask(a6),d0
  1355.         bset    #15,d0
  1356.         move.w    d0,$dff096
  1357.         move.w    #300,d0
  1358.  
  1359. PT_rtnloop2    dbra    d0,PT_rtnloop2
  1360.         move.l    PTv_SmpRepStart(a6),(a5)
  1361.         move.l    PTv_SmpRepLen(a6),4(a5)
  1362.  
  1363. PT_rtnend    move.l    (sp)+,d1
  1364.         rts
  1365.  
  1366. PT_volumefineup
  1367.         tst.b    PTm_Counter(a4)
  1368.         bne.w    PT_return
  1369.         moveq.l    #0,d0
  1370.         move.b    PTv_Step3(a6),d0
  1371.         and.b    #$f,d0
  1372.         bra.w    PT_volslideup
  1373.  
  1374. PT_volumefinedown
  1375.         tst.b    PTm_Counter(a4)
  1376.         bne.w    PT_return
  1377.         moveq.l    #0,d0
  1378.         move.b    PTv_Step3(a6),d0
  1379.         and.b    #$0f,d0
  1380.         bra.w    PT_volslidedown2
  1381.  
  1382. PT_notecut    moveq.l    #0,d0
  1383.         move.b    PTv_Step3(a6),d0
  1384.         and.b    #$0f,d0
  1385.         cmp.b    PTm_Counter(a4),d0
  1386.         bne.w    PT_return
  1387.         clr.b    PTv_SmpVolume(a6)
  1388.         move.w    #0,8(a5)
  1389.         rts
  1390.  
  1391. PT_notedelay    moveq.l    #0,d0
  1392.         move.b    PTv_Step3(a6),d0
  1393.         and.b    #$0f,d0
  1394.         cmp.b    PTm_Counter(a4),d0
  1395.         bne.w    PT_return
  1396.         move.w    PTv_Step0(a6),d0
  1397.         beq.w    PT_return
  1398.         move.l    d1,-(sp)
  1399.         bra.w    PT_doretrig
  1400.  
  1401. PT_patterndelay
  1402.         tst.b    PTm_Counter(a4)
  1403.         bne.w    PT_return
  1404.         moveq.l    #0,d0
  1405.         move.b    PTv_Step3(a6),d0
  1406.         and.b    #$0f,d0
  1407.         tst.b    PTm_PtDelTime2(a4)
  1408.         bne.w    PT_return
  1409.         addq.b    #1,d0
  1410.         move.b    d0,PTm_PtDelTime(a4)
  1411.         rts
  1412.  
  1413. PT_funkit    tst.b    PTm_Counter(a4)
  1414.         bne.w    PT_return
  1415.         move.b    PTv_Step3(a6),d0
  1416.         and.b    #$0f,d0
  1417.         lsl.b    #4,d0
  1418.         and.b    #$0f,PTv_GlissFunk(a6)
  1419.         or.b    d0,PTv_GlissFunk(a6)
  1420.         tst.b    d0
  1421.         beq.w    PT_return
  1422.  
  1423. PT_updatefunk    movem.l    a0/d1,-(sp)
  1424.         moveq.l    #0,d0
  1425.         move.b    PTv_GlissFunk(a6),d0
  1426.         lsr.b    #4,d0
  1427.         beq.s    PT_funkend
  1428.         lea.l    PT_funktable(pc),a0
  1429.         move.b    (a0,d0.w),d0
  1430.         add.b    d0,PTv_FunkOffs(a6)
  1431.         btst    #7,PTv_FunkOffs(a6)
  1432.         beq.s    PT_funkend
  1433.         clr.b    PTv_FunkOffs(a6)
  1434.  
  1435.         move.l    PTv_SmpRepStart(a6),d0
  1436.         moveq.l    #0,d1
  1437.         move.w    PTv_SmpRepLen(a6),d1
  1438.         add.l    d1,d0
  1439.         add.l    d1,d0
  1440.         move.l    PTv_WaveStart(a6),a0
  1441.         addq.l    #1,a0
  1442.         cmp.l    d0,a0
  1443.         blo.s    PT_funkok
  1444.         move.l    PTv_SmpRepStart(a6),a0
  1445.  
  1446. PT_funkok    move.l    a0,PTv_WaveStart(a6)
  1447.         moveq.l    #-1,d0
  1448.         sub.b    (a0),d0
  1449.         move.b    d0,(a0)
  1450.  
  1451. PT_funkend    movem.l    (sp)+,a0/d1
  1452.         rts
  1453.  
  1454. PT_funktable    dc.b    0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1455.  
  1456. PT_vibratotable    
  1457.         dc.b    000,024,049,074,097,120,141,161
  1458.         dc.b    180,197,212,224,235,244,250,253
  1459.         dc.b    255,253,250,244,235,224,212,197
  1460.         dc.b    180,161,141,120,097,074,049,024
  1461.  
  1462. PT_periodtable
  1463. ; tuning 0, normal
  1464.         dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1465.         dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1466.         dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1467. ; tuning 1
  1468.         dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1469.         dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1470.         dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1471. ; tuning 2
  1472.         dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1473.         dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1474.         dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1475. ; tuning 3
  1476.         dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1477.         dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1478.         dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1479. ; tuning 4
  1480.         dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1481.         dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1482.         dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1483. ; tuning 5
  1484.         dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1485.         dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1486.         dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1487. ; tuning 6
  1488.         dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1489.         dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1490.         dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1491. ; tuning 7
  1492.         dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1493.         dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1494.         dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1495. ; tuning -8
  1496.         dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1497.         dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1498.         dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1499. ; tuning -7
  1500.         dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1501.         dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1502.         dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1503. ; tuning -6
  1504.         dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1505.         dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1506.         dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1507. ; tuning -5
  1508.         dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1509.         dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1510.         dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1511. ; tuning -4
  1512.         dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1513.         dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1514.         dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1515. ; tuning -3
  1516.         dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1517.         dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1518.         dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1519. ; tuning -2
  1520.         dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1521.         dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1522.         dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1523. ; tuning -1
  1524.         dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1525.         dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1526.         dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1527.  
  1528.     cnop 0,4
  1529.  
  1530. PT_chan1temp    dcb.b    PTv_sizeof,0
  1531. PT_chan2temp    dcb.b    PTv_sizeof,0
  1532. PT_chan3temp    dcb.b    PTv_sizeof,0
  1533. PT_chan4temp    dcb.b    PTv_sizeof,0
  1534.  
  1535. PT_MainData    dcb.b    PTm_sizeof,0
  1536.  
  1537.